#ifndef PIN_CONFIG_H
#define PIN_CONFIG_H

// ESP32-WROOM-32E-N4 沙画绘图机引脚配置文件
// 基于 WIRING_GUIDE.md 中的引脚分配

// ==================== 步进电机引脚 ====================
// 角度电机 (28BYJ-48 + ULN2003_1)
#define THETA_IN1_PIN     14      // 角度电机IN1 -> ULN2003_1 IN1
#define THETA_IN2_PIN     27      // 角度电机IN2 -> ULN2003_1 IN2
#define THETA_IN3_PIN     26      // 角度电机IN3 -> ULN2003_1 IN3
#define THETA_IN4_PIN     25      // 角度电机IN4 -> ULN2003_1 IN4

// 半径电机 (28BYJ-48 + ULN2003_2)
#define RHO_IN1_PIN       16     // 半径电机IN1 -> ULN2003_2 IN1
#define RHO_IN2_PIN       4     // 半径电机IN2 -> ULN2003_2 IN2
#define RHO_IN3_PIN       15     // 半径电机IN3 -> ULN2003_2 IN3
#define RHO_IN4_PIN       13     // 半径电机IN4 -> ULN2003_2 IN4

// ==================== 限位开关引脚 ====================
#define THETA_HOME_PIN    32      // 角度轴限位开关
#define RHO_HOME_PIN      33     // 半径轴限位开关

// ==================== 控制按钮引脚 ====================
#define WFRS_BUTTON_PIN   17     // WIFI配置初始化按键

// ==================== 指示灯引脚 ====================
#define STATUS_LED_PIN    2      // 状态LED 

// ==================== SD卡 SPI 引脚 ====================
#define SD_MISO_PIN       19     // SPI MISO
#define SD_SCK_PIN        18     // SPI SCK  
#define SD_MOSI_PIN       23     // SPI MOSI
#define SD_CS_PIN         5     // SD卡片选信号

// ==================== WS2812 LED灯带引脚 ====================
#define WS2812_PIN        21     // WS2812 LED灯带数据线

// ==================== 电源管理引脚 ====================
// 5V 和 GND 通过硬件连接，无需定义引脚

// ==================== 引脚验证宏 ====================
// 用于编译时检查引脚冲突
#define VALIDATE_PIN_UNIQUE() \
  static_assert(THETA_IN1_PIN != THETA_IN2_PIN, "Theta motor pin conflict"); \
  static_assert(THETA_IN1_PIN != THETA_IN3_PIN, "Theta motor pin conflict"); \
  static_assert(THETA_IN1_PIN != THETA_IN4_PIN, "Theta motor pin conflict"); \
  static_assert(RHO_IN1_PIN != RHO_IN2_PIN, "Rho motor pin conflict"); \
  static_assert(RHO_IN1_PIN != RHO_IN3_PIN, "Rho motor pin conflict"); \
  static_assert(RHO_IN1_PIN != RHO_IN4_PIN, "Rho motor pin conflict");

// ==================== 引脚功能说明 ====================
/*
ESP32-WROOM-32E-N4 引脚使用说明:

实际引脚分配:
- GPIO2:  状态LED (STATUS_LED_PIN) - 注意启动时状态
- GPIO4:  半径电机IN2 (RHO_IN2_PIN) -> ULN2003_2 IN2
- GPIO5:  SD卡片选信号 (SD_CS_PIN)
- GPIO13: 半径电机IN4 (RHO_IN4_PIN) -> ULN2003_2 IN4
- GPIO14: 角度电机IN1 (THETA_IN1_PIN) -> ULN2003_1 IN1
- GPIO15: 半径电机IN3 (RHO_IN3_PIN) -> ULN2003_2 IN3
- GPIO16: 半径电机IN1 (RHO_IN1_PIN) -> ULN2003_2 IN1
- GPIO17: WIFI配置按键 (WFRS_BUTTON_PIN)
- GPIO18: SPI时钟 (SD_SCK_PIN)
- GPIO19: SPI数据输入 (SD_MISO_PIN)
- GPIO21: WS2812 LED灯带数据线
- GPIO23: SPI数据输出 (SD_MOSI_PIN)
- GPIO25: 角度电机IN4 (THETA_IN4_PIN) -> ULN2003_1 IN4
- GPIO26: 角度电机IN3 (THETA_IN3_PIN) -> ULN2003_1 IN3
- GPIO27: 角度电机IN2 (THETA_IN2_PIN) -> ULN2003_1 IN2
- GPIO32: 角度轴限位开关 (THETA_HOME_PIN)
- GPIO33: 半径轴限位开关 (RHO_HOME_PIN)

ESP32-WROOM-32E特殊引脚说明:
- GPIO0:  BOOT引脚 (下拉启动下载模式)
- GPIO1:  U0TXD (串口发送，通常用于调试)
- GPIO3:  U0RXD (串口接收，通常用于调试)
- GPIO6-11: 连接内部SPI Flash，不可用
- GPIO12: 启动时电平敏感，避免外部上拉

电源连接:
- 5V: ULN2003驱动器电源 + 28BYJ-48电机电源 + WS2812电源
- 3.3V: ESP32逻辑电平
- GND: 公共地线

注意事项:
1. GPIO32,33用于限位开关，支持内部上拉，无ADC2冲突
2. GPIO2用于状态LED，启动时需要高阻态，建议添加上拉电阻
3. WIFI配置按键使用内部上拉电阻
4. GPIO0为BOOT引脚，启动时下拉进入下载模式
5. ULN2003驱动器使用5V供电，逻辑兼容3.3V
6. WS2812灯带使用5V电源，数据线3.3V兼容
7. SD卡使用VSPI接口 (GPIO18/19/23/5)
8. 避免使用GPIO6-11 (连接Flash)，GPIO1/3 (串口调试)
9. 28BYJ-48步进电机采用半步进模式控制
10. ESP32-WROOM-32E有38个GPIO，其中30个可用于外设连接
*/

#endif // PIN_CONFIG_H
